#include<iostream>
using namespace std;
typedef long long LL;
LL n;
const int N = 5e5 + 10;
LL a[N];
LL tmp[N];

LL Sort(LL l, LL r)
{
	if (l>=r)
	{
		return 0;//别忘了写出口
	}
	//归并排序，先分后治
	LL ret = 0;//这个不要定义成全局了，不然他会把过程中的也加上，就不对了
	LL mid = (l + r)/2;
	ret+=Sort(l, mid);//注意这里传的是1到mid,然后mid+1到r，千万别传错了，传错要么不对，要么死循环
	ret+=Sort(mid+1, r);//左边的逆序数加右边的逆序数 再加跨越两边的逆序数
	LL cur1 =l;LL cur2 = mid+1;//注意和区间对应着
	LL pos = l;
	while (cur1 <= mid && cur2 <= r)
	{
		if (a[cur1] > a[cur2])
		{
			tmp[pos++] = a[cur2++];
			ret += mid - cur1 + 1;
		}
		//右大于左这不是逆序
		else if (a[cur2] >= a[cur1])
		{
			tmp[pos++] = a[cur1++];
		}
	}
	while (cur1 <= mid)
	{
		tmp[pos++] = a[cur1++];
	}
	while (cur2 <= r)
	{
		tmp[pos++] = a[cur2++];
	}
	//复制
	for (int i = l;i <= r;i++)
	{
		a[i] = tmp[i];
	}
	return ret;
}
int main()
{
	cin >> n;
	for (int i = 1;i <= n;i++)
	{
		cin >> a[i];
	}
	//任何排序算法的本质都是消除逆序对
	//如果只允许交换相邻元素，问排序的最小次数，其实就是问逆序对的个数
	//在排列组合中，将一个排列通过相邻元素交换变成另一个排列，所需的最小交换次数等于该排列的逆序数
	//(deepseek说的)而归并排序是求解逆序数的效率最高的方式
	cout << Sort(1, n) << endl;
}